﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Senac.Escola.Projeto.Models;
using Senac.Escola.Projeto.Models.Context;
using Senac.ProjetoIntegrador.EducacaoWeb.Models;

namespace Senac.ProjetoIntegrador.EducacaoWeb.Controllers
{ 
    public class AtividadeController : Controller
    {
        private Context db = new Context();

        public ViewResult Index()
        {
            Session[EducacaoWebConstants.SESSION_PERGUNTA_ATUAL] = "0";
            return View(db.Atividade.ToList().Where(x => x.Ativo == true));
        }

        public ActionResult Create()
        {
            return View();
        } 

        [HttpPost]
        public ActionResult Create(Atividade atividade)
        {
            Usuario UsuarioLogado = (Usuario)Session[EducacaoWebConstants.SESSION_USUARIO_ATUAL];  

            if(UsuarioLogado.TipoUsuario.Nome == "PROFESSOR")
            {
                atividade.Categoria = db.Categoria.Where(x => x.Professor.UsuarioID == UsuarioLogado.UsuarioID).First(); 
            }    
                
            if (ModelState.IsValid)
            {
                atividade.QuantidadePerguntas = 0;
                db.Atividade.Add(atividade);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            return View(atividade);
        }
        
        public ActionResult Edit(int id)
        {
            Atividade atividade = db.Atividade.Find(id);
            return View(atividade);
        }

        [HttpPost]
        public ActionResult Edit(Atividade atividade)
        {
            if (ModelState.IsValid)
            {
                db.Entry(atividade).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(atividade);
        }
 
        public ActionResult Delete(int id)
        {
            Atividade atividade = db.Atividade.Find(id);
            return View(atividade);
        }

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {            
            Atividade atividade = db.Atividade.Find(id);

            if (atividade != null)
            {
                atividade.Ativo = false;
                db.Entry(atividade).State = EntityState.Modified;
                db.SaveChanges();
            }

            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        public ActionResult ListarPerguntas(int id)
        {
            Atividade atividade = db.Atividade.Find(id);
            return View(atividade);
        }

        public ActionResult FazerAtividade()
        {
            Session[EducacaoWebConstants.SESSION_PERGUNTA_ATUAL] = null;

            Usuario AlunoLogado = (Usuario)Session[EducacaoWebConstants.SESSION_USUARIO_ATUAL];

            IList<Boletim> BoletimModel = db.Boletim.Where(x => x.Aluno.UsuarioID == AlunoLogado.UsuarioID).ToList<Boletim>();
            IList<Atividade> ListAtividadeExecutada = new List<Atividade>();

            foreach(var item in BoletimModel)
            {
                Atividade Atividade = db.Atividade.Find(item.AtividadeID);
                Atividade.Executada = true;
                Atividade.Ativo = false;
                Atividade.NotaIndividual = item.Pontuacao;
                ListAtividadeExecutada.Add(Atividade);
            }

            IList<Atividade> ListAtividadeTotal = db.Atividade.ToList();

            ListAtividadeTotal.Concat(ListAtividadeExecutada);

            return View(ListAtividadeTotal);
        }

        public ActionResult ExecutandoAtividade(int id)
        {
            Atividade _Atividade = db.Atividade.Find(id);

            _Atividade.NumeroPergunta = Convert.ToInt32(Session[EducacaoWebConstants.SESSION_PERGUNTA_ATUAL]);


            if (_Atividade.NumeroPergunta < _Atividade.Pergunta.Count)
            {
                if (_Atividade.NumeroPergunta.Equals(0))
                {
                    _Atividade.NumeroPergunta = 1;
                }
                else
                {
                    _Atividade.NumeroPergunta++;
                }
            }

            Session[EducacaoWebConstants.SESSION_PERGUNTA_ATUAL] = Convert.ToString(_Atividade.NumeroPergunta);

            foreach (var item in _Atividade.Pergunta)
            {
                if (item.NumeroPergunta.Equals(_Atividade.NumeroPergunta))
                    item.RespostaDaVez = true;
                else
                    item.RespostaDaVez = false;
            }

            ViewBag.Questao = _Atividade.NumeroPergunta;
            ViewBag.TotalPergutas = _Atividade.Pergunta.Count;

            return View(_Atividade);
        }

        [HttpPost]
        public ActionResult SaveResposta(Pergunta pergunta)
        {
            return View();
        }

        [HttpPost]
        public ActionResult Responder(Atividade atividade)
        {
            Atividade vm = db.Atividade.Find(atividade.ID);

            Resultado Resultado = new Resultado { Atividade = vm};

            bool UmaPorVez = true;

            foreach (var item in vm.Pergunta)
            {
                if (UmaPorVez)
                {
                    if (!item.IsRespondida)
                    {
                        foreach (var item2 in item.Resposta)
                        {
                            if (item2.IsResposta)
                            {
                                if (item2.RespostaID == Convert.ToInt32(atividade.Radio))
                                {
                                    Resultado.IsAcerto = true;
                                    Resultado.Pergunta = item;
                                }
                                else
                                {
                                    Resultado.IsAcerto = false;
                                    Resultado.Pergunta = item;
                                }
                                item.IsRespondida = true;
                            }
                        }

                        item.IsRespondida = true;
                        UmaPorVez = false;

                        if(ModelState.IsValid)
                        {
                            db.Resultado.Add(Resultado);
                            db.SaveChanges();
                        }
                    }
                }
            }

            return RedirectToAction("ExecutandoAtividade", atividade);
        }

        public ActionResult FinalizarAtividade(int id)
        {

            Usuario UsuarioLogado = (Usuario)Session[EducacaoWebConstants.SESSION_USUARIO_ATUAL];

            Aluno AlunoLogado = db.Aluno.Where(x => x.UsuarioID == UsuarioLogado.UsuarioID).First<Aluno>();

            Boletim BoletimModel = new Boletim 
            {
                Atividade = db.Atividade.Find(id),
                Aluno = AlunoLogado
            };

            IList<Resultado> ListResultado = db.Resultado.Where(x => x.AtividadeID == id).ToList<Resultado>();
              

            foreach (var item in ListResultado)
            {
                if (item.IsAcerto)
                {
                    BoletimModel.Acertos++;
                }
                else
                {
                    BoletimModel.Erros++;
                }
            }

            BoletimModel.Pontuacao = (string)MathNota(BoletimModel.Acertos, BoletimModel.Atividade.QuantidadePerguntas);

            db.Boletim.Add(BoletimModel);
            db.SaveChanges();

            return RedirectToAction("ExibirBoletim", "Boletim", new {BoletimID = BoletimModel.BoletimID });
        }

        public string MathNota(int Acertos, int TotalPergunta)
        {
            return String.Format("{0}{1}", ((100 * Acertos) / TotalPergunta), @"%");
        }
    } 
}